From f55e3f7eda1d54d1a87a098822cc5e345b2f36db Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 25 Oct 2015 13:11:17 -0400 Subject: [PATCH] inspector: Be more careful with dead objects gtk_inspector_object_tree_find_object accesses the type information of the object, so we can't safely use it on an already decaying object when we get a weak notify. Instead just walk the tree and compare pointers, that is safe. https://bugzilla.gnome.org/show_bug.cgi?id=756852 --- gtk/inspector/object-tree.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/gtk/inspector/object-tree.c b/gtk/inspector/object-tree.c index e3fa925185..c124c79b54 100644 --- a/gtk/inspector/object-tree.c +++ b/gtk/inspector/object-tree.c @@ -607,14 +607,32 @@ on_selection_changed (GtkTreeSelection *selection, g_signal_emit (wt, signals[OBJECT_SELECTED], 0, object); } +static gboolean +remove_cb (GtkTreeModel *model, + GtkTreePath *path, + GtkTreeIter *iter, + gpointer data) +{ + GObject *dead_object = data; + GObject *lookup; + + gtk_tree_model_get (model, iter, OBJECT, &lookup, -1); + + if (lookup == dead_object) + { + gtk_tree_store_remove (GTK_TREE_STORE (model), iter); + return TRUE; + } + + return FALSE; +} + static void gtk_object_tree_remove_dead_object (gpointer data, GObject *dead_object) { GtkInspectorObjectTree *wt = data; - GtkTreeIter iter; - if (gtk_inspector_object_tree_find_object (wt, dead_object, &iter)) - gtk_tree_store_remove (wt->priv->model, &iter); + gtk_tree_model_foreach (GTK_TREE_MODEL (wt->priv->model), remove_cb, dead_object); } static gboolean -- 2.30.2